package com.yunc.base.config;

import com.zaxxer.hikari.HikariDataSource;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * @author taocongcong
 * @create 2017-12-15 12:05
 */
@Data
@ConfigurationProperties(prefix = "spring.datasource")
public class MybatisProperties {

    /**
     * 等待连接池分配连接的最大时长（毫秒），超过这个时长还没可用的连接则发生SQLException， 缺省:30秒
     */
    private long connectionTimeout;

    /**
     * 一个连接idle状态的最大时长（毫秒），超时则被释放（retired），缺省:10分钟
     */
    private long idleTimeout;

    /**
     * 一个连接的生命时长（毫秒），超时而且没被使用则被释放（retired），缺省:30分钟，建议设置比数据库超时时长少30秒，参考MySQL
     *             wait_timeout参数（show variables like '%timeout%';）
     */
    private long maxLifetime;

    /**
     * 连接池中允许的最大连接数。缺省值：10；推荐的公式：((core_count * 2) + effective_spindle_count)
     * effective_spindle_count:磁盘列阵中的磁盘数(默认1)
     */
    private int maximumPoolSize;

    /**
     * 尽量不要minimumIdle，允许HikariCP充当固定大小的连接池
     */
    // private int minimumIdle;

    public HikariDataSource dataSource(HikariDataSource datasource) {
        datasource.setConnectionTimeout(connectionTimeout);
        datasource.setIdleTimeout(idleTimeout);
        datasource.setMaxLifetime(maxLifetime);
        datasource.setMaximumPoolSize(maximumPoolSize);
        // datasource.setMinimumIdle(minimumIdle);
        datasource.setAutoCommit(true);
        // 如果您的驱动程序支持JDBC4，我们强烈建议您不要设置此属性。这是针对不支持JDBC4的“传统”驱动程序Connection.isValid() API
        // 这是在连接从池中获得连接以确认与数据库的连接仍然存在之前将要执行的查询
        // datasource.setConnectionTestQuery("SELECT 1");
        return datasource;
    }
}
